﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.AccesoDatos;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Onshi.POS.Modelo.Entidades.Tipos;

namespace Onshi.POS.Repositorios
{
    public class RepositorioRegistros : RepositorioEntidad<Registro, Int32, IServicioDatosRegistros>
    {
        #region Constructores

        public RepositorioRegistros()
            : base()
        {
        }

        #endregion

        #region Atributos

        private RepositorioEventos repositorioEventos = new RepositorioEventos();
        private RepositorioUsuarios repositorioUsuarios = new RepositorioUsuarios();

        #endregion

        #region Metodos

        public override Registro DevolverPorId(Int32 id)
        {
            var registro = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (registro == null)
                using (var ds = servicioDatos.Registros_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        registro = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(registro);
                    }
            return registro;
        }

        public void Insertar(Registro registro)
        {
            registro.Id = servicioDatos.Registros_Insertar(registro.Evento.Id, registro.Usuario.Id);
            registro.Fecha = DateTime.Now;
        }

        public void Insertar(Registro registro, Vendedor vendedor)
        {
            Insertar(registro);
            servicioDatos.RegistrosVendedores_Insertar(registro.Id, vendedor.Id);
        }

        public void Insertar(Registro registro, Articulo articulo)
        {
            Insertar(registro);
            servicioDatos.RegistrosArticulos_Insertar(registro.Id, articulo.Id);
        }

        public void Insertar(Registro registro, Usuario usuario)
        {
            Insertar(registro);
            servicioDatos.RegistrosUsuarios_Insertar(registro.Id, usuario.Id);
        }

        public void Insertar(Registro registro, Cliente cliente)
        {
            Insertar(registro);
            servicioDatos.RegistrosClientes_Insertar(registro.Id, cliente.Id);
        }

        public void Insertar(Registro registro, Proveedor proveedor)
        {
            Insertar(registro);
            servicioDatos.RegistrosProveedores_Insertar(registro.Id, proveedor.Id);
        }

        public void Insertar(Registro registro, Impuesto impuesto)
        {
            Insertar(registro);
            servicioDatos.RegistrosImpuestos_Insertar(registro.Id, impuesto.Id);
        }

        protected override Registro FilaAEntidad(DataRow fila)
        {
            var registro = new Registro();
            registro.Id = (Int32)fila["IdRegistro"];
            registro.Fecha = (DateTime)fila["Fecha"];
            registro.Evento = repositorioEventos.DevolverPorId((Byte)fila["IdEvento"]);
            registro.Usuario = repositorioUsuarios.DevolverPorId((Int32)fila["IdUsuario"]);
            return registro;
        }

        #endregion
    }
}
